home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / presto / presto10.lha / src / mips_swtch.s < prev    next >
Text File  |  1991-12-11  |  3KB  |  133 lines

  1. #include <asm.h>
  2. #include <mips/regdef.h>
  3.  
  4. #define regspace 9 * 4 + 4 + 6 * 8
  5. #define floats 0
  6. #define registers floats + 6 * 8
  7. #define returnaddr regspace - 4
  8. #define topstack 0
  9.         .text   
  10.         .align  2
  11.         .file   2 "mips_swtch.s"
  12.  
  13.     # _init_stack(Thread* this (a0), int* topOfStack(a1))
  14.     # Initialize the top frame on the stack 
  15.     .globl    init_stack
  16.     .ent    init_stack 
  17. init_stack:
  18.     subu    sp, regspace
  19.     .frame    sp, regspace, ra
  20.  
  21. /* Save registers. */
  22.     sw    s0, registers + 0(sp)
  23.     sw    s1, registers + 4(sp)
  24.     sw    s2, registers + 8(sp)
  25.     sw    s3, registers + 12(sp)
  26.     sw    s4, registers + 16(sp)
  27.     sw    s5, registers + 20(sp)
  28.     sw    s6, registers + 24(sp)
  29.     sw    s7, registers + 28(sp)
  30.     sw    s8, registers + 32(sp)
  31.  
  32. /* Save return address */
  33.     sw    ra, returnaddr(sp)
  34.     .mask    0xc0ff0000, -4
  35.  
  36. /* Save floating point registers */
  37.     s.d    $f20, floats + 0(sp)
  38.     s.d    $f22, floats + 8(sp)
  39.     s.d    $f24, floats + 16(sp)
  40.     s.d    $f26, floats + 24(sp)
  41.     s.d    $f28, floats + 32(sp)
  42.     s.d    $f30, floats + 40(sp)
  43.     .fmask    0x55400000, regspace
  44.     sw    sp, 24(a0)    # save current sp in "this"
  45.     move    sp, a1        # initialize new sp
  46.     j    ra
  47.     .end    init_stack
  48.  
  49.     #    swtch__6ThreadFv() a.k.a Thread::swtch()
  50.  
  51.     .globl    swtch__6ThreadFv
  52.     .ent    swtch__6ThreadFv 2
  53. swtch__6ThreadFv:
  54.     subu    sp, regspace
  55.     .frame    sp, regspace, ra
  56. /* Save registers. */
  57.     sw    s0, registers + 0(sp)
  58.     sw    s1, registers + 4(sp)
  59.     sw    s2, registers + 8(sp)
  60.     sw    s3, registers + 12(sp)
  61.     sw    s4, registers + 16(sp)
  62.     sw    s5, registers + 20(sp)
  63.     sw    s6, registers + 24(sp)
  64.     sw    s7, registers + 28(sp)
  65.     sw    s8, registers + 32(sp)
  66. /* Save return address */
  67.     sw    ra, returnaddr(sp)
  68.     .mask    0xc0ff0000, -4
  69. /* save floating point registers */
  70.     s.d    $f20, floats + 0(sp)
  71.     s.d    $f22, floats + 8(sp)
  72.     s.d    $f24, floats + 16(sp)
  73.     s.d    $f26, floats + 24(sp)
  74.     s.d    $f28, floats + 32(sp)
  75.     s.d    $f30, floats + 40(sp)
  76.     .fmask    0x55400000, regspace
  77.  
  78.     # save current sp in reg 5
  79.     move    t0, sp
  80.     # load current sp/fp from hidden first argument this
  81.     lw    sp, 24(a0)
  82.     # store prev sp in "this"
  83.     sw    t0, 24(a0)
  84.  
  85.     # restore
  86.     lw    s0, registers + 0(sp)
  87.     lw    s1, registers + 4(sp)
  88.     lw    s2, registers + 8(sp)
  89.     lw    s3, registers + 12(sp)
  90.     lw    s4, registers + 16(sp)
  91.     lw    s5, registers + 20(sp)
  92.     lw    s6, registers + 24(sp)
  93.     lw    s7, registers + 28(sp)
  94.     lw    s8, registers + 32(sp)
  95.     lw    ra, returnaddr(sp)
  96.     /* restore floats */
  97.     l.d    $f20, floats + 0(sp)
  98.     l.d    $f22, floats + 8(sp)
  99.     l.d    $f24, floats + 16(sp)
  100.     l.d    $f26, floats + 24(sp)
  101.     l.d    $f28, floats + 32(sp)
  102.     l.d    $f30, floats + 40(sp)
  103.         addu    sp, regspace
  104.     j    ra
  105.     .end    _swtch__6ThreadFv
  106.  
  107.  
  108. #ifdef notdef
  109.  
  110.  #       MipsSaveSP(int *savsp)
  111.     .globl    MipsSaveSP
  112.     .ent    MipsSaveSP 2
  113. MipsSaveSP:
  114.     .option    O1
  115.     .frame    sp, 0, $31
  116.     sw    sp, ($4)
  117.     j    $31
  118.     .end    MipsSaveSP
  119.  
  120.  
  121.  
  122.  #       MipsRestoreSP(int *savsp)
  123.     .globl    MipsRestoreSP
  124.     .ent    MipsRestoreSP 2
  125. MipsRestoreSP:
  126.     .option    O1
  127.     .frame    sp, 0, $31
  128.     move    sp,$4        # sp = $4
  129.     j    $31
  130.     .end    MipsRestoreSP
  131.  
  132. #endif
  133.